#ifndef F4F432E1_1D1C_4DE8_8BEE_67E0D17DADF6
#define F4F432E1_1D1C_4DE8_8BEE_67E0D17DADF6

// 1.调用abroad()函数
#include <iostream>
#include <cstdlib>
// 1.调用abroad()函数
// abort()函数原型在头文件<cstdlib>或者stdlib.h中
// abort();
// 将会在标准错误流中打印一条信息,具体打印什么取决于编译器实现

// int main()
// {
//     double x, y, z;

//     std::cout << "Enter two numbers: ";
//     while (std::cin >> x >> y)
//     {
//         z = hmean(x, y);
//         std::cout << "Harmonic mean of " << x << " and " << y
//                   << " is " << z << std::endl;
//         std::cout << "Enter next set of numbers <q to quit>: ";
//     }
//     std::cout << "Bye!\n";
//     return 0;
// }

// double hmean(double a, double b)
// {
//     if (a == -b)
//     {
//         std::cout << "untenable arguments to hmean()\n";
//         std::abort();
//     }
//     return 2.0 * a * b / (a + b);
// }

// 2.返回错误码
/**
 * @brief 通过定义一个ans指针作为函数运算返回答案, 函数本身返回值作为执行成功或者失败的标志
 *
 * @param a
 * @param b
 * @param ans
 * @return true
 * @return false
 */
// bool hmean(double a, double b, double *ans);

// #include <cfloat>

// int main()
// {
//     double x, y, z;

//     std::cout << "Enter two numbers: ";
//     while (std::cin >> x >> y)
//     {
//         if (hmean(x, y, &z))
//             std::cout << "Harmonic mean of " << x << " and " << y
//                       << " is " << z << std::endl;
//         else
//             std::cout << "One value should not be the negative "
//                       << "of the other - try again.\n";
//         std::cout << "Enter next set of numbers <q to quit>: ";
//     }
//     std::cout << "Bye!\n";
//     return 0;
// }

// bool hmean(double a, double b, double *ans)
// {
//     if (a == -b)
//     {
//         *ans = DBL_MAX; // 这个值定义在cfloat中
//         return false;
//     }
//     else
//     {
//         *ans = 2.0 * a * b / (a + b);
//         return true;
//     }
// }

// 3.异常机制
// C++针对程序运行过程中出现的异常情况的一种响应.
// 异常提供了一个将控制权将程序的一个部分转移到另一个部分的能力或途径
double hmean(double a, double b);

    int main()
{
    double x, y, z;

    std::cout << "Enter two numbers: ";
    while (std::cin >> x >> y)
    {
        try
        { // start of try block
            z = hmean(x, y);
        }                     // end of try block
        catch (const char *s) // start of exception handler
        {
            std::cout << s << std::endl;
            std::cout << "Enter a new pair of numbers: ";
            continue;
        } // end of handler
        std::cout << "Harmonic mean of " << x << " and " << y
                  << " is " << z << std::endl;
        std::cout << "Enter next set of numbers <q to quit>: ";
    }
    std::cout << "Bye!\n";
    return 0;
}

double hmean(double a, double b)
{
    if (a == -b)
        throw "bad hmean() arguments: a = -b not allowed";  // 依靠throw关键字
    return 2.0 * a * b / (a + b);
}

#endif /* F4F432E1_1D1C_4DE8_8BEE_67E0D17DADF6 */
